package com.cskaoyan.javase.oop2._1extends._4hierarchy;

/**
 * 继承层次
 * 思考：
 *      1.Java中的一个可以直接继承多个类吗？
 *          不行，Java当中的一个类只能直接继承某一个类，不能直接继承多个类
 *          也就是说： Java中的某个类最多只能有一个直接父类
 *          这种继承的设计称之为“单继承”“单重继承”
 *
 *      2.Java中的一个类，就只能有一个父类吗？
 *          不是，直接父类只有一个，但是直接父类可能还有父类，所以一个类可以有多个“间接父类”
 *
 *      扩展：
 *          Every class has {@code Object} as a superclass.
 *          Java中的所有类都要继承Object类，Object类是Java中所有类的父类
 *          解释：
 *              1.如果一个类没有用extends声明它的父类，那么它就直接继承Object
 *                  当然这个继承是隐式的，没有必要写出来
 *              2.如果一个类用extends关键字声明它的父类，那么Object就是它的间接父类
 *                  它也一定会继承Object
 *
 * 虽然直接父类只有一个，但Java中一个类仍然可以有很多个"间接父类"，因为父类可能还有父类。比如A继承B，B又继承了C，那么A的直接父类就是B，间接父类是C。于是就形成了下面几个概念：
 *
 * 祖先类：处在继承顶层的类。
 * 继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 * 继承链：从某一个子类开始，到其祖先类的路径。
 *  在Java中定义一个类，如果没有直接通过语法写出继承了Xxx类，那么它的直接父类就是——Object。
 *
 * Object类是Java所有类继承层次中顶层祖先类。Java中的每个类，都或直接，或间接的继承了Object。
 *
 * 继承层次的概念：
 * 继承层次中需要注意的地方：
 *
 * 1.在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。没有孙子类或者重孙类这种概念。
 * 2.在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
 * 3.在一条继承链中，下游类总可以看成一个上游类，存在"is-a"关系。
 *
 * 4.不在同一条继承链中的类，没有任何关系。虽然看起来像"兄弟姐妹"类，但是Java是不讲究血统的。
 *      因为一方面，子类可以自由扩展功能；另一方面，继承来的东西也是可以修改的。
 *      所以"兄弟姐妹"可能完全和"我"不同，没有任何关系。
 *      java继承不考虑血缘关系，仅考虑继承链
 * 5.不能循环定义继承。比如A继承B，B继承C，再让C来继承A，这是不行的。
 * 6.继承链可以无限延伸下去，但是一般来说有个5~6层继承，已经很多了。
 *
 *
 * @since 14:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Class 'Demo' explicitly extends 'java.lang.Object'
public class Demo {
    public static void main(String[] args) {
        // Grandson gs = new Grandson();
        // Father2 f = new Father2();

        /*
            Grandson可以用几种方式创建对象？
                1.Son
                2.Father
                3.Grandfather
                4.自己
                5.Object
         */
        Object o = new Grandson();
        Grandfather gf = new Grandson();
        Father f = new Grandson();
        Son s = new Grandson();
        Grandson gs = new Grandson();


    }
}

// Class cannot extend multiple classes
// class Son extends Father,Father2{}
class Grandfather {
    int num1;
}

class Father extends Grandfather {
    int num2;
}

class Father2 extends Grandfather {
    int num3;
}

class Son extends Father {
    int num4;
}

class Grandson extends Son {
    int num5;
}